Feature creation 是由現有的特徵建立新的特徵。新的特徵可經由演算法自動產生,或運用資料的領域常識,經由數學運算產生。
Feature creation更常出現在自然語言處理上,例如為文章(Text)建立bag of words或字元頻率表。
Interaction Features
檢視整個資料集,了解變數的領域知識,建立新特徵。
兩個特徵相加:如果我們的銷售資料,有藍筆和黑筆的個別資料,我們需要把他加總,如果我們只在意筆的總銷售量。
df['sales_pens'] = df['sales_blue_pens'].add(df['sales_black_pens'])
兩個特徵相減:例如我們有房子建築的日期和房子購買的日期,我們可以將其相減獲得銷售時的屋齡。
df['house_age_at_purchase'] = df['house_purchase_date'].sub(df['house_built_date'])
兩個特徵相乘:將銷售產品的單價,乘上銷售數量取的銷售額特徵。
df['sales'] = df['quantity'].prod(df['Unit price'])
兩個特徵相除:有一些變數經過相除獲會對我們更有意義 例如:債務收入比率,我們可以將總負債除以總收入。
df['debt-to-income ratio'] = df['total debt'].prod(df['total income'])
Polynomial expansion多項式擴張
一個變數和自己結合,也就是變數的多項式結合。變數的多項式結合可以傳達更多的訊息,也能獲得特徵之間的關聯,對線性學習來說較好。
使用scikit-learn:
from sklearn.preprocessing import PolynomialFeatures
#2個特徵*X*和*Y*,3列
X = np.arange(6).reshape(3, 2)
X
array([[0, 1],
[2, 3],
[4, 5]])
多項式擴充,原來只有X和Y變數,現在增加了XX、YY、XY和bias。
poly = PolynomialFeatures(degree=2, interaction_only=False, include_bias=True)
poly.fit_transform(X)
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
應用在boston_dataset上:
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
boston_dataset = load_boston()
data = pd.DataFrame(boston_dataset.data,
columns=boston_dataset.feature_names)
data['MEDV'] = boston_dataset.target
data.head()
/|CRIM| ZN |INDUS |CHAS| NOX| RM| AGE| DIS| RAD| TAX| PTRATIO| B| LSTAT| MEDV
------------- | -------------
0 |0.00632| 18.0| 2.31| 0.0| 0.538| 6.575| 65.2| 4.0900| 1.0 |296.0| 15.3| 396.90| 4.98| 24.0
1 |0.02731| 0.0| 7.07| 0.0| 0.469| 6.421| 78.9| 4.9671| 2.0| 242.0| 17.8| 396.90| 9.14| 21.6
2| 0.02729| 0.0| 7.07| 0.0| 0.469| 7.185| 61.1| 4.9671| 2.0 |242.0| 17.8| 392.83| 4.03| 34.7
3| 0.03237| 0.0| 2.18| 0.0| 0.458| 6.998| 45.8| 6.0622| 3.0| 222.0| 18.7| 394.63| 2.94| 33.4
4| 0.06905| 0.0| 2.18| 0.0| 0.458| 7.147| 54.2| 6.0622| 3.0| 222.0| 18.7| 396.90 |5.33| 36.2
X_train, X_test, y_train, y_test = train_test_split(
data.drop('MEDV', axis=1), data['MEDV'], test_size=0.3, random_state=0)
X_train.shape, X_test.shape
((354, 13), (152, 13))
進行多項式擴充,選取'LSTAT', 'RM', 'NOX'三個特徵做擴充。
poly = PolynomialFeatures(degree=3, interaction_only=False, include_bias=False)
poly.fit(X_train[['LSTAT', 'RM', 'NOX']])
train_t = poly.transform(X_train[['LSTAT', 'RM', 'NOX']])
test_t = poly.transform(X_test[['LSTAT', 'RM', 'NOX']])
查看擴充後的新特徵名稱。
poly.get_feature_names(['LSTAT', 'RM', 'NOX'])
['LSTAT',
'RM',
'NOX',
'LSTAT^2',
'LSTAT RM',
'LSTAT NOX',
'RM^2',
'RM NOX',
'NOX^2',
'LSTAT^3',
'LSTAT^2 RM',
'LSTAT^2 NOX',
'LSTAT RM^2',
'LSTAT RM NOX',
'LSTAT NOX^2',
'RM^3',
'RM^2 NOX',
'RM NOX^2',
'NOX^3']
查看擴充後個數
len(poly.get_feature_names(['LSTAT', 'RM', 'NOX']))
19
Combining features with trees使用決策樹
結合指定的特徵和決策樹,建立新的特徵。
我們使用和前面相同的3個特徵。
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import GridSearchCV
建立決策樹學習模型:
param_grid = {'max_depth': [3,4,None]}
tree_model = GridSearchCV(DecisionTreeRegressor(random_state=0),
cv = 5,
scoring = 'neg_mean_squared_error',
param_grid = param_grid)
輸入我們選定的3個特徵。
tree_model.fit(X_train[['LSTAT', 'RM', 'NOX']], y_train)
建立新的特徵。
X_train['new_feat'] = tree_model.predict(X_train[['LSTAT', 'RM', 'NOX']])
X_test['new_feat'] = tree_model.predict(X_test[['LSTAT', 'RM', 'NOX']])